#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

/* 任务优先级 */

void myTask1(void *pvParameters)
{

    char *pcTxtInTask;
    pcTxtInTask = (char *)pvParameters;
    while (1)
    {
        printf("pcTxtInTask = %s\n", pcTxtInTask);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }

    vTaskDelete(NULL);
}

void myTask2(void *pvParameters)
{

    char *pcTxtInTask;
    pcTxtInTask = (char *)pvParameters;
    while (1)
    {
        printf("pcTxtInTask = %s\n", pcTxtInTask);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }

    vTaskDelete(NULL);
}

void app_main(void)
{
    UBaseType_t iPriority1 = 0;
    UBaseType_t iPriority2 = 0;
    TaskHandle_t pxTask1 = NULL;
    TaskHandle_t pxTask2 = NULL;

    // 1 如果有相同优先级的任务，会根据任务创建的先后顺序来执行
    // xTaskCreate(
    //     myTask1,
    //     "myTask1",
    //     2048,
    //     "123",
    //     1, // 优先级，优先级默认可选范围[0,24]
    //     NULL);

    // xTaskCreate(
    //     myTask2,
    //     "myTask2",
    //     2048,
    //     "abc",
    //     1, // 优先级，优先级默认可选范围[0,24]
    //     NULL);

    // 2 优先级不同，则按照优先级高低执行
    // 如果第一次输出，没有正确按照优先级执行，改用xTaskCreatePinnedToCore，并且将任务都放在core1则可
    xTaskCreatePinnedToCore(
        myTask1,
        "myTask1",
        2048,
        "123",
        10,       // 优先级，优先级默认可选范围[0,24]
        &pxTask1, // 注意传入指针
        1);       // 任务放在core1
    xTaskCreatePinnedToCore(
        myTask2,
        "myTask2",
        2048,
        "abc",
        20,       // 优先级，优先级默认可选范围[0,24]
        &pxTask2, // 注意传入指针
        1);       // 任务放在core1

    // 3 任务优先级的获取
    iPriority1 = uxTaskPriorityGet(pxTask1);
    printf("iPriority1 = %d\n", iPriority1);

    iPriority2 = uxTaskPriorityGet(pxTask2);
    printf("iPriority2 = %d\n", iPriority2);

    // 延时
    vTaskDelay(pdMS_TO_TICKS(5000));
    printf("即将修改优先级\n");
    // 4 任务优先级的修改
    vTaskPrioritySet(pxTask1, 20);
    vTaskPrioritySet(pxTask2, 10);

    // 5 任务优先级的获取
    iPriority1 = uxTaskPriorityGet(pxTask1);
    printf("new iPriority1 = %d\n", iPriority1);

    iPriority2 = uxTaskPriorityGet(pxTask2);
    printf("new iPriority2 = %d\n", iPriority2);
}
